package com.king;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;

import com.king.event.AppEvent;
import com.king.util.Async;

import javafx.application.Application;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;

/**
 * fx-应用
 * 
 * @author king
 * @date 2025年6月12日-13:04:49
 */
@Slf4j
public class App extends Application {

	/**
	 * 设计成单例的，如此才方便在其他地方注入APP时，使用此属性
	 */
	private static ConfigurableApplicationContext springContext;

	public static final String ICON = "/img/king-log.png";

	/**
	 * 定义CTRL+F按键组合
	 */
	public final static KeyCombination ON_FIND = new KeyCodeCombination(KeyCode.F, KeyCodeCombination.CONTROL_DOWN);

	/**
	 * 按下回车键时
	 */
	public final static KeyCombination ON_ENTER = new KeyCodeCombination(KeyCode.ENTER);

	/**
	 * 定义CTRL+S的按键组合
	 */
	public static final KeyCombination ON_SAVE = new KeyCodeCombination(KeyCode.S, KeyCodeCombination.CONTROL_DOWN);

	/**
	 * 此乃FX的start，因为Spring在调用此Start时，不一定初始化完成，所以不能再这里开始
	 * 需要使用Spring的ApplicationListener
	 */
	@Override
	public void start(Stage stage) throws Exception {
		springContext.publishEvent(new AppEvent(stage));
	}

	@Override
	public void init() throws Exception {
		springContext = new SpringApplicationBuilder().sources(AppStarter.class)
				.run(getParameters().getRaw().toArray(new String[0]));
	}

	@Override
	public void stop() throws Exception {
		if (springContext != null) {
			Async async = getBean(Async.class);
			// 关闭线程池
			async.shutdown();
			springContext.close();
		}
	}

	/**
	 * 从spring上下文获取其管理的bean
	 * 
	 * @param <T>
	 * @param clz
	 * @return
	 * @author king
	 * @date 2025年7月16日-17:57:03
	 */
	public static <T> T getBean(Class<T> clz) {
		return springContext.getBean(clz);
	}
}
